package com.capgemini.task;

import java.util.Scanner;
import java.util.regex.Pattern;

public class FizzBuzz {

    /**
     * @description 你是一名体育老师，在某次课距离下课还有五分钟时，你决定搞一个游戏。此时有N名学生在上 课。游戏的规则是:
     * 1.	让所有学生排成一队，然后按顺序报数。
     * 2.	学生报数时，如果所报数字是3的倍数，那么不能说该数字，而要说Fizz;如果所报数字是5 的倍数，那么要说Buzz;如果所报数字是第7的倍数，那么要说Whizz。
     * 3.	学生报数时，如果所报数字同时是两个特殊数的倍数情况下，也要特殊处理，比如3和5的 倍数，那么不能说该数字，而是要说FizzBuzz, 以此类推。如果同时是三个特殊数的倍数， 那么要说FizzBuzzWhizz。
     * 4.	学生报数时，如果所报数字包含了3，那么也不能说该数字，而是要说相应的单词，比如要 报13的同学应该说Fizz。
     * 5.	如果数字中包含了3，那么忽略规则2和规则3，比如要报30的同学只报Fizz，不报FizzBuzz 。
     * @version 1.0.0
     * @author haiyuan.jiao
     * @since 2022/2/9
     **/
    private static String FIZZ = "Fizz";
    private static String BUZZ = "Buzz";
    private static String WHIZZ = "Whizz";

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        String val;
        do {
            System.out.print("请输入学生数(不能以0开头,输入\"#\"退出)：");
            val = input.next();
            if (!val.equals("#")) {
                if (!checkNum(val)) {
                    System.out.println("请输入数字,且不能以0开头！");
                    continue;
                }
                System.out.println("当前学生为：" + val + "名，开始报数");
                Integer count = Integer.valueOf(val);
                for (int num = 1; num <= count; num++) {
                    System.out.println(numberOff(num));
                }
            }
        } while (!val.equals("#"));
        System.out.println("你输入了\"#\"，程序已经退出！");
        input.close();
    }

    private static String numberOff(Integer num) {
        //如果数字中包含了3，那么忽略规则2和规则3，比如要报30的同学只报Fizz，不报FizzBuzz 。
        if (String.valueOf(num).contains("3")) {
            return FIZZ;
        }
        //如果所报数字是3的倍数，那么不能说该数字，而要说Fizz;
        StringBuilder sb = new StringBuilder();
        if (num % 3 == 0) {
            sb.append(FIZZ);
        }
        //如果所报数字是5 的倍数，那么要说Buzz;
        if (num % 5 == 0) {
            sb.append(BUZZ);
        }
        //如果所报数字是第7的倍数，那么要说Whizz。
        if (num % 7 == 0) {
            sb.append(WHIZZ);
        }
        return sb.toString().equals("") ? String.valueOf(num) : sb.toString();
    }

    private static Boolean checkNum(String val) {
        String regex = "^[1-9]\\d*$";
        Pattern pattern = Pattern.compile(regex);
        return pattern.matcher(val).matches();
    }

}
